// 我们定义了一个泛型类
// 同样我们把泛型变量放在类的名称后面，这样它就可以约束所有类的成员了
// 我们需要注意的是：泛型不能应用于类的静态成员
class Log<T> {
  run(value: T) {
    console.log(value);
    return value;
  }
  /* static run1(value: T){
    console.log(value);
    return value;
  } // 静态成员不能引用类类型参数。*/
}

let log1 = new Log<number>(); // 那么实例的方法呢将会受到泛型的约束
log1.run(1); // run 的参数只能是 number 类型

// 此外呢我们也可以不传入类型参数
let log2 = new Log(); // 当不指定这个类型参数的时候，run参数value的值就可以是任意的值
log2.run({ a: 1 });
log2.run("1");

// 泛型约束

// 首先我们要改造一个我们之前的Log函数，我们在这里不仅要打印除参数也希望打印出参数的一个属性

interface Length {
  length: number;
}
// 让类型T去继承这个Length接口，这表明 T 受到了一定的约束就不是任意类型都可以传了
// 输入的参数呢不管是什么类型但必须具有lenth属性
function logFun<T extends Length>(value: T): T {
  console.log(value, value.length); // 如果不继承 Length 接口的化 value 是没有 length 属性的，这里是会报错的
  return value;
}

logFun([1, 2, 3]);
// logFun(100); // 类型“number”的参数不能赋给类型“Length”的参数。
logFun('hello');
logFun({length: 1});


export {};
